package pl.edu.agh.student.todo.dao;

import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import pl.edu.agh.student.todo.model.Todo;

public enum Dao {
	INSTANCE;

	public List<Todo> listTodos() {
		EntityManager em = EMFService.get().createEntityManager();
		// Read the existing entries
		Query q = em.createQuery("select m from Todo m");
		List<Todo> todos = q.getResultList();
		return todos;
	}

	public void add(String userId, String summery, String description,
			String url, Date date) {
		synchronized (this) {
			EntityManager em = EMFService.get().createEntityManager();
			Todo todo = new Todo(userId, summery, description, url);
			todo.setTime(date);
			
			em.persist(todo);
			em.close();
		}
	}
	
	public void updateSent(long id, boolean value) {
		synchronized (this) {
			EntityManager em = EMFService.get().createEntityManager();

			Todo todo = em.find(Todo.class, id);
			todo.setSent(value);
			
			
			em.persist(todo);
			em.close();
		}
	}

	public List<Todo> getTodos(String userId) {
		EntityManager em = EMFService.get().createEntityManager();
		Query q = em
				.createQuery("select t from Todo t where t.author = :userId");
		q.setParameter("userId", userId);
		List<Todo> todos = q.getResultList();
		
		//em.close();
		return todos;
	}
	
	public List<Todo> getTodos(Date time) {
		EntityManager em = EMFService.get().createEntityManager();
		Query q = em
				.createQuery("select t from Todo t where t.sent = :sent");
		//q.setParameter("time", time);
		q.setParameter("sent", false);
		
		List<Todo> todos = q.getResultList();

		return todos;
	}

	public void remove(long id) {
		EntityManager em = EMFService.get().createEntityManager();
		try {
			Todo todo = em.find(Todo.class, id);
			em.remove(todo);
		} finally {
			em.close();
		}
	}
}